在S7300/400型PLC中使用高級語言編程
2005/8/9 10:03:00
S7-SCL是一種類似于Pasical、Deliphi的高級編程語言,其符合國際標準IEC 61131-3,也就是說支持該標準的任意廠家的PLC均可以使用與之相似的語言編程。這種語言適合于處理復雜的邏輯和大量的數學運算,由于其具有高級語言的編程結構,因此和S7的STL語句表編程方式比較起來有著更加方便的控制方式,可以這樣說,只要是必須使用語句表的地方,我們均可以考慮使用SCL,也許STL在執行時比SCL更加高效,但事實上也不一定,首先SCL可以編譯成STL,同時SCL設計時可以優化編程,而STL若運用不當,可能還會將低效率。當然在目前的這種系列的PLC上,效率對于我們來說已是次要的,我們更關心的是編程結構。就像在PC機上,舍棄了匯編語言,而主要采用C/C++等高級語言。總體來說,SCL適合于編寫標準功能塊,由于在維護中,它和STL一樣,不象Lad一樣利于維護,因此這些標準功能塊都應該有文檔說明,以便用戶了解其功能。 下面的內容主要是參考西門子的S7-SCL文檔,對SCL進行了系統的介紹,最后給出了示例。 這里假設讀者是學過S7-300/400編程,并曾經學過至少一種計算機高級編程語言。 一、 軟件的使用 1、 創建一個新的S7-SCL Source 文件 打開工程項目à選擇CPU站à選擇S7 Programà選擇Sources 在右邊窗口的空白處點右鍵選Insert New Objectà點擊SCL Source 雙擊創建的SCL Source文件,進入SCL編輯界面。 2、 塊保護 在SCL Source文件的開頭添加關鍵字:KNOW_HOW_PROTECT,當打開由其創建的塊時,只能顯示參數,而看不到內容。 3、主菜單”Insert”下的”Block Template”可用于插入如OB,FB等各種塊的結構。”Control Structure”菜單可插入各種流程控制結構,這些都可以簡化編程。 4、在運行程序之前,首先必須對它進行編譯,可以編譯整個Source文件或者某個被選擇的塊,通過選擇菜單File > Compile Selected Blocks。也可以把幾個Source文件一起進行編譯,其方法是創建一個S7-SCL compilation control file.在該文件中依次輸入需要編譯的SCL Source文件名,然后執行編譯即可。 二、語法規則 1、編寫SCL Source文件的一般規則 ● FB, FC, OB, DB以及用戶定義的UDT,它們使用的任意數字號均可以在SCL Source中編輯。 ● 每種塊類型都有它自己的結構。 ● 每段落或者每個變量的聲明以符號”;”標志結束。 ● 不區分大小寫。 ● 注釋僅存在于程序文檔中,它不影響程序運行。 ● 當一個功能塊被調用時,其背景數據塊被自動創建,因此它們不需要被編輯。 ● DB0有特定用途,因此在程序中不能創建DB0. 2、 編寫塊的先后次序 ● 被調用的塊必須位于調用塊之前。 ● UDT的定義必須位于其被使用的位置之前。 ● 共享數據塊必須位于那些使用它的所有塊之前。 三、 數據類型 1、數據類型預覽 Ⅰ、基本數據類型 

2、補充 <1>、DATE_AND_TIME Data Type 其值的范圍:DT#1990-01-01-0:0:0.0---------DT#2089-12-31-23:59:59.999 該類型以BCD碼形式存儲。 
例如20/Oct./1995 12:20:30 and 10 milliseconds顯示如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10 <2>STRING e.g. 聲明 VAR Text1 : String [123]; //該字符串的最大容量為123個字符 Text2 : String; //該字符串的默認容量為254個字符 END_VAR 初始化:x : STRING[7]:=Address; //在使用STRING前,必須對它賦值。 FUNCTION Test : STRING[45] VAR_TEMP x : STRING[45]; END_VAR x := a; x := concat (in1 := x, in2 := x); Test := x; //返回值 END_FUNCTION <3>數組類型 e.g. VAR CONTROLLER1 : //聲明3行、4列的二位整數數組,并對其初始化 ARRAY[1..3,1..4] OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ; CONTROLLER2 : ARRAY[1..10] OF REAL ; //聲明10個數的一維實數數組 END_VAR 注:數組的最大維數為6維,數組的索引范圍為-32768 --- 32767之間的任意整數。所有的基本數據類型均可用于數組。數組可以使用變量進行索引,例如: arrname_1[ i ] := arrname_2[ j ] ; <4>STRUCT類型 e.g. 聲明一個結構MOTOR中包含另一個結構DATA。對結構聲明時,可以初始化元素,也可以在使用之前再初始化。 VAR MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR 結構以WORD的形式結尾,否則系統自動把丟失的字節補到結構中去。 <5>用戶定義類型UDT (使用關鍵字TYPE) TYPE //定義名字為MEASVALUES的數據類型 MEASVALUES: STRUCT BIPOL_1 : INT := 5; BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := W#16#1919 ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA :REAL ; END_STRUCT; END_STRUCT; END_TYPE //在FB10中使用該類型 FUNCTION_BLOCK FB10 VAR MEAS_RANGE : MEASVALUES; //創建UDT數據 END_VAR BEGIN // 使用UDT數據 MEAS_RANGE.BIPOL_1 := -4 ; MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; END_FUNCTION_BLOCK <6>POINTER類型 e.g. //定義功能塊FC100 FUNCTION FC100 : VOID //VOID表明該功能不返回值 VAR_IN_OUT //定義FC100的輸入輸出型參數 N_out : INT; out : POINTER; //定義POINTER型數據類型,參數均為臨時變量 END_VAR VAR_TEMP //定義臨時變量 ret : INT; END_VAR BEGIN //進入函數主體 // ... ret := SFC79(N := N_out, SA := out); END_FUNCTION //定義功能塊FB100 FUNCTION_BLOCK FB100 VAR //定義靜態變量,即離開塊后仍舊保存狀態的變量 ii : INT; aa : ARRAY[1..1000] OF REAL; END_VAR BEGIN // ... FC100(N_out := ii, out := aa); //調用FC100,使用指針的方式傳遞整個數組 // ... END_FUNCTION_BLOCK <7>ANY類型 e.g. VAR_INPUT //輸入型變量 iANY : ANY; //定義為ANY END_VAR VAR_TEMP pANY : ANY; //定義為ANY END_VAR CASE ii OF //CASE分支語句 1: pANY := MW4; // 將MW4的地址賦給pANY // of MW4 3..5: //等于3,4,5的情況下 pANY:= aINT[ii]; // pANY contains the address // of the ii th // element of the aINT field; 100: pANY := iANY; // pANY contains the value // of the iANY input variable ELSE pANY := NIL; // pANY contains the value // of the NIL pointer END_CASE; SFCxxx(IN := pANY); 四、局部變量和參數的聲明 1、變量 靜態變量:用于保持塊的數據,該數據存在背景數據塊中。 臨時變量:僅在塊運行過程中存在。 若多個變量的數據類型一致,可用如下方式: VALUE2, VALUE3,VALUE4,....: INT; 聲明時可以初始化: VALUE :REAL := 20.25; 數組的初始化有兩種方式: CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := -54, 736, -83, 77; 當把相鄰的數組元素賦相同的值時,例如,把A3[2]到A3[11]的值設為100.0: A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0; 2、塊參數 輸入參數: 用于接收當塊被調用時的輸入值,他們是只讀的。 輸出參數: 傳輸當前值到這個調用塊,在被調用塊中應該對該參數賦值 輸入/輸出參數:用于接收當塊被調用時的輸入值,并可以把結果返回到調用塊。 3、使用多重背景 聲明方式如下: Supply1 : FB10; // Supply1為FB10的背景DB Supply2,Supply3,Supply4 : FB100; //為FB100聲明多個背景DB Motor1 : Motor ; // Motor為某個FB的符號名 4、 變量的聲明 
五、常量 S7-SCL常量分位常量、數字常量、字符常量、時間常量,使用CONST…END_CONST聲明。 e.g. CONST Number := 10 ; //整數常量 TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; //時間常量 NAME := SIEMENS ; //字符串常量 NUMBER2 := 2 * 5 + 10 * 4 ; NUMBER3 := 3 + NUMBER2 ; END_CONST 1、 位常量 Bool#false 位的值為TRUE或者FALSE 8#177777





提交
查看更多評論
其他資訊
工業自動化設計高級參考
使用西門子的SCL語言編寫ABB變頻器的總線控制程序塊
PLC的面向對象編程
簡化監控軟件的編程方法